import 'package:flutter/cupertino.dart';
import 'package:netease_cloud_music_api/netease_cloud_music_api.dart';
import 'package:netease_cloud_music_api/utils/player_request.dart';
import 'package:netease_cloud_music_api/utils/request.dart';

mixin Top {
  /// 新碟上架
  /// 说明 : 调用此接口 , 可获取新碟上架列表 , 如需具体音乐信息需要调用获取专辑列表接 口 [album] , 然后传入 id, 如 [album(id: 32311)]
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 ,如 :( 页数 -1)*30, 其中 30 为 limit 的值 , 默认为 0
  /// [albumArea] : [AlbumArea.ALL] :全部, [AlbumArea.ZH] :华语, [AlbumArea.EA] :欧美, [AlbumArea.KR] :韩国, [AlbumArea.JP] :日本
  /// [albumType] : [AlbumType.Hot] 热门 [AlbumType.New] 全部 默认为 [AlbumType.New]
  /// [dateTime] : 时间, 默认为当天, 设定 [DateTime] 需要年月 如 DateTime(2019,5)
  Future<PlayerRequestResponse> topAlbum({AlbumArea? albumArea, AlbumType? albumType, int? limit, int? offset, DateTime? dateTime}) {
    albumArea = albumArea ?? AlbumArea.ALL;
    albumType = albumType ?? AlbumType.New;
    dateTime = dateTime ?? DateTime.now();
    Map<AlbumArea, String> area = {
      AlbumArea.ALL: 'ALL',
      AlbumArea.JP: 'JP',
      AlbumArea.EA: 'EA',
      AlbumArea.ZH: 'ZH',
      AlbumArea.KR: 'KR',
    };
    Map<AlbumType, String> type = {AlbumType.New: 'new', AlbumType.Hot: 'hot'};
    Map<String, dynamic> data = {
      'area': area[albumArea],
      'limit': limit ?? 30,
      'offset': offset ?? 0,
      'type': type[albumType],
      'year': dateTime.year,
      'month': dateTime.month,
      'total': false,
      'rcmd': true
    };
    print(data);
    return PlayerRequest(
      url: 'https://music.163.com/api/discovery/new/albums/area',
      data: data,
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 热门歌手
  /// 说明 : 调用此接口 , 可获取热门歌手数据
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 ,如 :( 页数 -1)*30, 其中 30 为 limit 的值 , 默认为 0
  Future<PlayerRequestResponse> topArtist({int? limit, int? offset}) {
    Map<String, dynamic> data = {'limit': limit ?? 30, 'offset': offset ?? 0, 'total': false};
    return PlayerRequest(
      url: 'https://music.163.com/weapi/artist/top',
      data: data,
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// mv 排行
  /// 说明 : 调用此接口 , 可获取 mv 排行
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 ,如 :( 页数 -1)*30, 其中 30 为 limit 的值 , 默认为 0
  /// [MVArea] : [MVArea.ALL] :全部, [MVArea.ZH] :内地, [MVArea.EA] :欧美, [MVArea.KR] :韩国, [MVArea.JP] :日本 [MVArea.HK] 港台
  Future<PlayerRequestResponse> topMV({int? limit, int? offset, MVArea mvArea = MVArea.ALL}) {
    Map<MVArea, String> area = {
      MVArea.ALL: '',
      MVArea.JP: '日本',
      MVArea.EA: '欧美',
      MVArea.ZH: '内地',
      MVArea.KR: '韩国',
      MVArea.HK: '港台'
    };
    Map<String, dynamic> data = {'limit': limit ?? 30, 'offset': offset ?? 0, 'total': false, 'area': area[mvArea]};
    return PlayerRequest(
      url: 'https://music.163.com/weapi/artist/top',
      data: data,
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 获取精品歌单
  /// 说明 : 调用此接口 , 可获取精品歌单
  /// [albumArea] : [AlbumArea.ALL] :全部, [AlbumArea.ZH] :华语, [AlbumArea.EA] :欧美, [AlbumArea.KR] :韩国, [AlbumArea.JP] :日本
  Future<PlayerRequestResponse> topSongs({required AlbumArea albumArea}) {
    Map<AlbumArea, int> area = {
      AlbumArea.ALL: 0,
      AlbumArea.JP: 8,
      AlbumArea.EA: 96,
      AlbumArea.ZH: 7,
      AlbumArea.KR: 16,
    };
    Map<String, dynamic> data = {'total': false, 'areaId': area[albumArea]};
    return PlayerRequest(
      url: 'https://music.163.com/weapi/v1/discovery/new/songs',
      data: data,
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 歌手榜
  /// 说明 : 调用此接口 , 可获取排行榜中的歌手榜
  /// [artistArea] : [ArtistArea.ZH] :华语, [ArtistArea.EA] :欧美, [ArtistArea.KR] :韩国, [ArtistArea.JP] :日本
  /// 仅支持上述4个参数, 传其他均为 [ArtistArea.ZH]
  Future<PlayerRequestResponse> topListArtist({ArtistArea? artistArea, int? limit, int? offset}) {
    artistArea = artistArea ?? ArtistArea.ALL;
    Map<ArtistArea, int> area = {
    ArtistArea.ALL: 1,
    ArtistArea.JP: 4,
    ArtistArea.EA: 2,
    ArtistArea.ZH: 1,
    ArtistArea.KR: 3,
    ArtistArea.Other: 1
    };
    Map<String, dynamic> data = {'total': false, 'type': area[artistArea], 'limit': limit ?? 30, 'offset': offset ?? 0};
    return PlayerRequest(
      url: 'https://music.163.com/weapi/toplist/artist',
      data: data,
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 所有榜单内容摘要
  /// 说明 : 调用此接口,可获取所有榜单内容摘要
  Future<PlayerRequestResponse> topListDetail() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/toplist/detail',
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.weapi),
    ).request();
  }

  /// 所有榜单
  /// 说明 : 调用此接口,可获取所有榜单
  Future<PlayerRequestResponse> topList() {
    return PlayerRequest(
      url: 'https://music.163.com/api/toplist',
      options: PlayerRequestOptions(method: PlayerRequestMethod.post, crypto: EncryptType.linuxapi),
    ).request();
  }
}
